using System;
using System.Collections.Generic;
using Csla;
using ENT.GP.Datos.MysqlHelper;
using System.Data;
using ENT.GP.Core.Proyecto;

namespace ENT.GP.Core.Estadisticas
{
    [Serializable]
    public class DatosEstadisticaDosVariables :
      ReadOnlyListBase<DatosEstadisticaDosVariables, DatoEstadisticaDosVariables>
    {
        #region Authorization Rules

        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowGet(typeof(DatosEstadisticaDosVariables), "Role");
        }

        #endregion

        #region Factory Methods

        public static DatosEstadisticaDosVariables GetDatosEstadisticaDosVariables(string campo,int tipo,int entidad,int idEmpresa)
        {
            var criteria = GraficoCriteria.NewProyectoCriterio();
            criteria.Nombre = campo;
            criteria.TipoId = tipo;
            criteria.EntidadId = entidad;
            criteria.IDEmpresa = idEmpresa;
            return DataPortal.Fetch<DatosEstadisticaDosVariables>(criteria);
        }


        public static DatosEstadisticaDosVariables GetDatosEstadisticaDosVariablesBinacional(string campo, int idEmpresa, Boolean flag)
        {
            return DataPortal.Fetch<DatosEstadisticaDosVariables>(new SingleCriteria<DatosEstadisticaDosVariables,string>(campo));
        }
        

        public static DatosEstadisticaDosVariables GetDatosDeEstadisticaDosVariablesBinacional(string campo, int idEmpresa)
        {
            CritDoubleEstadis criteria = new CritDoubleEstadis();
            criteria.Nombre = campo;
            criteria.IDEmpresa = idEmpresa;
            return DataPortal.Fetch<DatosEstadisticaDosVariables>(criteria);
        }

        public static DatosEstadisticaDosVariables GetDatosDeEstadistica(string campo, int tipo, int entidad, int idEmpresa)
        {
            var criteria = DatosCriteria.NewProyectoCriterio();
            criteria.Nombre = campo;
            criteria.TipoId = tipo;
            criteria.EntidadId = entidad;
            criteria.IDEmpresa = idEmpresa;
            return DataPortal.Fetch<DatosEstadisticaDosVariables>(criteria);
        }

        private DatosEstadisticaDosVariables()
        { /* require use of factory methods */ }

        #endregion


        #region Data Access
        /*
        private void DataPortal_Fetch(SingleCriteria<DatosEstadisticaDosVariables, string> criteria)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;

            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[1];
            parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("CAMPO", criteria.Value);
            foreach (DataRow items in objhm.EjecutarStoreProcedure(parametros, "Ejecutar_Consulta_Dinamica1").Tables[0].Rows)
            {
                this.Add(DatoEstadisticaDosVariables.GetDatoEstadisticaDosVariablesBinacional(items, false));
            }

            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }
        */
        private void DataPortal_Fetch(CritDoubleEstadis criteria)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;

            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[2];
            parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("CAMPO", criteria.Nombre);
            parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("IDEMP1", criteria.IDEmpresa);
            foreach (DataRow items in objhm.EjecutarStoreProcedure(parametros, "Datos_Consulta_Dinamica1").Tables[0].Rows)
            {
                this.Add(DatoEstadisticaDosVariables.GetDatoEstadisticaDosVariablesBinacional(items, true));
            }

            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }

        private void DataPortal_Fetch(GraficoCriteria criteria)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;

            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros;
            if (criteria.TipoId == 1)
            {
                parametros = new MySql.Data.MySqlClient.MySqlParameter[2];
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("CAMPO", criteria.Nombre);
                parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("IDEMP1", criteria.IDEmpresa);
                foreach (DataRow items in objhm.EjecutarStoreProcedure(parametros, "Ejecutar_Consulta_DinamicaNB").Tables[0].Rows)
                {
                    this.Add(DatoEstadisticaDosVariables.GetDatoEstadisticaDosVariables(items, false, 1));
                }
            }
            else
            {
                parametros = new MySql.Data.MySqlClient.MySqlParameter[4];
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("CAMPO", criteria.Nombre);
                parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("TIPO", criteria.TipoId);
                parametros[2] = new MySql.Data.MySqlClient.MySqlParameter("ENTIDAD", criteria.EntidadId);
                parametros[3] = new MySql.Data.MySqlClient.MySqlParameter("IDEMP1", criteria.IDEmpresa);
                foreach (DataRow items in objhm.EjecutarStoreProcedure(parametros, "Ejecutar_Consulta_Dinamica").Tables[0].Rows)
                {
                    this.Add(DatoEstadisticaDosVariables.GetDatoEstadisticaDosVariables(items, false, criteria.TipoId));
                }
                
            }
            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }

        private void DataPortal_Fetch(DatosCriteria criteria)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;

            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros;
            if (criteria.TipoId == 1)
            {
                parametros = new MySql.Data.MySqlClient.MySqlParameter[2];
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("CAMPO", criteria.Nombre);
                parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("IDEMP1", criteria.IDEmpresa);
                foreach (DataRow items in objhm.EjecutarStoreProcedure(parametros, "Datos_Consulta_DinamicaNB").Tables[0].Rows)
                {
                    this.Add(DatoEstadisticaDosVariables.GetDatoEstadisticaDosVariables(items, true, 1));
                }
            }
            else
            {
                parametros = new MySql.Data.MySqlClient.MySqlParameter[4];
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("CAMPO", criteria.Nombre);
                parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("TIPO", criteria.TipoId);
                parametros[2] = new MySql.Data.MySqlClient.MySqlParameter("ENTIDAD", criteria.EntidadId);
                parametros[3] = new MySql.Data.MySqlClient.MySqlParameter("IDEMP1", criteria.IDEmpresa);
                
                foreach (DataRow items in objhm.EjecutarStoreProcedure(parametros, "Datos_Consulta_Dinamica").Tables[0].Rows)
                {
                    this.Add(DatoEstadisticaDosVariables.GetDatoEstadisticaDosVariables(items, true, criteria.TipoId));
                }
            }
            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }

        #endregion

        public static object GetDatosEstadisticaDosVariablesBinacional(string Campo, int p)
        {
            throw new NotImplementedException();
        }
    }


    [Serializable]
    public class DatoEstadisticaDosVariables : ReadOnlyBase<DatoEstadisticaDosVariables>
    {
        #region Business Methods
        List<Entidad> _listaEntidades=new List<Entidad>();
        public int Id { get; set; }
        public int NumeroProyectos { get; set; }
        public string Nombre { get; set; }
        public string Canton { get; set; }
        public string Parroquia { get; set; }
        public double InversionTotal { get; set; }
        public double AportePlan { get; set; }
        public double AporteContraparte1 { get; set; }
        public double AporteContraparte2 { get; set; }
        public string Valor { get; set; }
        public int ValorId { get; set; }
        public string Entidad { get; set; }
        public string Pais { get; set; }
        public string Entidades { get; set; }
        public string TipoProyecto { get; set; }
        public int TipoProyectoId { get; set; }
        public List<Entidad> ListaEntidades {
            get
            { return _listaEntidades; }
            
        }
       
        #endregion

        #region Factory Methods

        internal static DatoEstadisticaDosVariables GetDatoEstadisticaDosVariables(DataRow childData,bool opc,int tipoP)
        {
            return DataPortal.FetchChild<DatoEstadisticaDosVariables>(childData,opc,tipoP);
        }
        internal static DatoEstadisticaDosVariables GetDatoEstadisticaDosVariablesBinacional(DataRow childData, bool opc)
        {
            return DataPortal.FetchChild<DatoEstadisticaDosVariables>(childData, opc);
        }
        private DatoEstadisticaDosVariables()
        { /* require use of factory methods */ }

        #endregion

        #region Data Access

        private void Child_Fetch(DataRow childData, bool opc, int tipoP)
        {
            
            this.NumeroProyectos = Convert.ToInt32(childData[0].ToString());
            this.InversionTotal = Convert.ToDouble(childData[1].ToString());            
            this.AportePlan = Convert.ToDouble(childData[2].ToString());
            this.AporteContraparte1 = Convert.ToDouble(childData[3].ToString());
            if (tipoP==1)
                TipoProyecto = childData[4].ToString();
            else
                this.AporteContraparte2 = Convert.ToDouble(childData[4].ToString());
            if (childData[5] != null)
                this.Valor = childData[5].ToString();
            else
                Valor = "";
            if (opc)
            {
                int vId;
                int.TryParse(childData[6].ToString(), out vId);
                ValorId = vId ;
                Nombre = childData[7].ToString();
                Canton = childData[8].ToString();
                Parroquia = childData[9].ToString();
            }
            if (opc && tipoP == 271)
            {
                Entidad = childData[10].ToString();
                Pais = childData[11].ToString();
            }
            
        }

        private void Child_Fetch(DataRow childData, bool opc)
        {
            string pEntera, pDecimal;
            string[] _entidadesP, _entidades;
            int idE;
            double valE,valED;
            this.NumeroProyectos = Convert.ToInt32(childData[0].ToString());
            this.InversionTotal = Convert.ToDouble(childData[1].ToString());
            Entidades = childData[2].ToString();
            this.Valor = childData[3].ToString();
            _entidadesP = Entidades.Split(';');
            foreach (var entidadP in _entidadesP)
            {
                _entidades = entidadP.Split(':');
                int.TryParse(_entidades[0],out idE);
                pEntera= _entidades[2].Split('.')[0];
                pDecimal = _entidades[2].Split('.')[1];
                double.TryParse(pEntera, out valE);
                double.TryParse(pDecimal, out valED);
                valED = valED / 100;
                valE = valED + valE;
                ListaEntidades.Add(new Entidad() { EntidadId = idE, Nombre = _entidades[1], ValorAporte = valE });
            }
            if (opc)
            {
                int vId;
                int.TryParse(childData[4].ToString(), out vId);
                ValorId = vId;
                Nombre = childData[5].ToString();
                Canton = childData[6].ToString();
                Parroquia = childData[7].ToString();
                Pais = childData[8].ToString();
            }

        }
        #endregion

        
    }
    public class Entidad
    {
        public int EntidadId { get; set; }
        public string Nombre { get; set; }
        public double ValorAporte { get; set; }
    }
    public class CritDoubleEstadis
    {
       
        public string Nombre { get; set; }
        public int IDEmpresa { get; set; }
    }

}
